from django.conf import settings
from django.db import models

# Create your models here.

# 定义图书模型类  一
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name="书名")
    bpub_date = models.DateField(verbose_name="发布日期")
    bread = models.IntegerField(default=0, verbose_name="阅读量")
    bcomment = models.IntegerField(default=0, verbose_name="评论量")
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
    bk_count = models.IntegerField(default=0, null=True, verbose_name="人物数量")
    # 添加图片属性,upload_to='boooktest'  指明该字段的图片保存在MEDIA_ROOT/meida/booktest这个目录下,注:这个目录需事先创建好
    image = models.ImageField(upload_to='booktest', verbose_name="图片", null=True)


    class Meta:
        db_table = "tb_books"  # 数据库表名,若未指明表名,Django会默认以 "小写app应用名_小写模型类名" 为数据库表名
        verbose_name = "图书"  # 别名,在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 模型的复数形式,若不指定,Django会自动在模型名称后增加s(即"图书s")

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

    def pub_date(self):
        return self.bpub_date.strftime("%Y-%m-%d")
    # 设置方法在admin中的显示效果
    pub_date.short_description = "发布日期"  # 设置列表中标题的名称
    pub_date.admin_order_field = "bpub_date"  # 设置排序属性

    def book_heros_counts(self):
        self.bk_count = self.book_heros.count()
        return self.bk_count
    book_heros_counts.short_description = "人物数量"
    # 这里排序有问题,主要是虽然获取了数量,但是并未保存在数据库中,而排序是以数据库中的字段值作为依据的,因此此时不行,后续实现 TODO
    book_heros_counts.admin_order_field = "bk_count"


# 定义人物类  多
class HeroInfo(models.Model):
    GENDER_CHOICES = (
        (0, "male"),
        (1, "femal")
    )
    hname = models.CharField(max_length=20, verbose_name="名称")
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name="性别")
    # null=True 允许数据库该字段为空
    hcomment = models.CharField(max_length=200, null=True, verbose_name="描述信息")
    """
    注意:
    定义外键后,子表中会自动生成一个hbook_id的字段表示外键关联的表中的id
    Django默认情况下每一个主表的对象都有一个是外键的属性,可以通过它查询到所有关于子表的信息.这个属性的名字就是子表的名称小写加上_set,具体到这个就是heroinfo_set(或者在定义外键时Foreignkey中添加related_name="book_heros",那么就是book_heros),默认返回的是QuerySet(查询--select语句,展示出database中的数据)可参考https://www.cnblogs.com/ee2213/p/3914620.html
    CASCADE 级联,删除主表数据时连同一起删除外键表中数据
    这里hbook取到的是一个对象, 那么创建时自然也要给关联表的一个对象
    """
    hbook = models.ForeignKey(BookInfo, related_name="book_heros",on_delete=models.CASCADE, verbose_name="图书")  # 一对多
    # hbook = models.OneToOneField(BookInfo)  # 一对一
    # hbook = models.ManyToManyField(BookInfo)  #多对多
    # hbook = models.ForeignKey("self")  # 自关联一对多
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")

    class Meta:
        db_table = "tb_heros"
        verbose_name = "人物"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hname


"""
定义完模型类后,需进行迁移(在终端执行):
    生成迁移文件 python manage.py makemigrations
    同步到数据库中 python manage.py migrate

Django的manage工具提供了shell命令,可以直接在终端在红执行测试python语句,通过如下命令进入shell:
    python manage.py shell

查看mysql数据库日志可以查看对数据库的操作记录, mysql日志文件默认没有产生,按如下配置:
    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    将68/69行取消注释,然后重启mysql服务.

使用如下命令打开mysql日志文件:
    tail -f /var/log/mysql/mysql.log   # 可以实时查看数据库的日志内容
    # 如提示需要sudo权限,执行
    # sudo tail -f /var/log/mysql/mysql.log

"""